home *** CD-ROM | disk | FTP | other *** search
/ Amiga Games Extra 1996 June / Amiga Games Extra 1996 #6.iso / userbox / publicdomain / apcopy / apcopy.doc < prev    next >
Text File  |  1996-02-24  |  13KB  |  354 lines

  1. ;
  2. ;     APCopy
  3. ;     ------
  4. ;
  5. ;     This program was put together because I wanted a simple and fast
  6. ;     file  copier.   It  has  no  bells and whistles but does contain
  7. ;     some  rudimentary  error  checking  just  in  case  the  user is
  8. ;     overdoing the apple brandy sauce.  It goes something like this...
  9. ;
  10. ;     Get some memory
  11. ;     Open dos and intuition
  12. ;     Check we've got CLI parameters
  13. ;     Open the files
  14. ;     Copy the source file
  15. ;     Close the files
  16. ;     Free the memory
  17. ;     Close dos and intuition
  18. ;     Exit
  19. ;
  20. ;     I  used  PhxAss/PhxLnk  to  put this together, plus CED and some
  21. ;     other programs I should mention.
  22. ;
  23. ;     I hope the annotations are of some use.
  24. ;
  25. ;     Anthony Peck
  26. ;     68 Woralul St
  27. ;     Waramanga ACT 2611 
  28. ;
  29. ;     E-mail: Anthony.Peck@Radford.act.edu.au
  30. ;
  31. ;     18 DEC 1995
  32. ;
  33. ;     -----------------------------------------------------------------
  34. ;     -----------------------------------------------------------------
  35.  
  36. ;     First some definitions to make the source code a little easier
  37. ;     to read (I hope).
  38.  
  39. ;     Memory allocation for AllocMem function
  40.  
  41. MKBUFFER                = 0        ; The start of the memory block 
  42. MKSOURCE        = 512      ; The start of the source buffer
  43. MKDESTINATION           = 612      ; The start of the dest buffer
  44. MKDOSBASE        = 712      ; The start of dosbase (long)
  45. MKINTUITIONBASE        = 716      ; The start of intuitionbase (long)
  46. MKINFILEHD              = 720      ; The start of the infile handle
  47. MKOUTFILEHD             = 724      ; The start of the outfile handle
  48.  
  49. TOTALMEM        = 728      ; The total memory required
  50.  
  51. ; Simple equivalents
  52.  
  53. Execbase                = $04      ; ExecBase (!)
  54. Mode_OLDFILE            = $03ED    ; Access mode for open file
  55. Mode_NEWFILE            = $03EE    ; Access mode for open file
  56. LF                      = $0A      ; Linefeed
  57.  
  58. ; Library Vector Offsets
  59.  
  60. _LVOOpenlibrary         = -$0228   ; Exec function
  61. _LVOCloselibrary        = -$019E   ; Exec function
  62. _LVOOpen                = -$1E     ; Dos function
  63. _LVOOutput              = -$3C     ; Dos function
  64. _LVOClose               = -$24     ; Dos function
  65. _LVORead                = -$2A     ; Dos function
  66. _LVOWrite               = -$30     ; Dos function
  67. _LVOAllocmem            = -$C6     ; Dos function
  68. _LVOFreemem             = -$D2     ; Dos function
  69. _LVOAutorequest         = -$015C   ; Intuition function
  70.  
  71. ;     Next some Macros to call on, easing the pain of library calls.
  72.  
  73. EXEC            MACRO
  74.         Move.l  Execbase,A6             ; Move Exec into a6
  75.         Jsr     _LVO\1(A6)              ; Call function
  76.                 ENDM
  77.  
  78. CALLINT         MACRO
  79.         Move.l  MKINTUITIONBASE(A4),A6  ; Move Intuition into a6
  80.         Jsr     _LVO\1(A6)              ; Call function
  81.                 ENDM
  82.  
  83. CALLDOS         MACRO
  84.         Move.l  MKDOSBASE(A4),A6        ; Move Dos into a6
  85.         Jsr     _LVO\1(A6)              ; Call function
  86.                 ENDM
  87.  
  88. ;     The real code starts here
  89.  
  90. start:
  91.  
  92.         Sub.B   #$01,D0            ; Subtract the first parameter
  93.         Move.l  D0,D5              ; Move the number remaining to D5
  94.         Move.l  A0,A5              ; Move the parameter address to A5
  95.  
  96. GetMem:
  97.  
  98.     Move.l    #TOTALMEM,d0       ; The total memory required
  99.     Move.l    #0,d1              ; Any mem will do (we clear it anyway)
  100.     EXEC    Allocmem           ; Go get it
  101.     Beq    Exit               ; Whoops, off we go
  102.     Move.l    D0,A4              ; All OK, so transfer to A4
  103.  
  104. CleanMem:
  105.  
  106. ;     Just in case we're a bit dirty.
  107.  
  108.         Move.l  A4,A3              ; Move the dirty stuff to A3
  109.         Move.l  #TOTALMEM-1,D0     ; Counter minus 1
  110.         
  111. 1$      Move.b  #0,(A3)+           ; Clear a byte and move it
  112.         Dbf     D0,1$              ; If not zero yet then go back
  113.  
  114. Openint:
  115.  
  116. ;     Opening intuition (needed for Autorequest).  The return address
  117. ;     stored in the appropriate location of the reserved memory.
  118.  
  119.         Lea      Intname,A1             ; Load library name
  120.         EXEC     Openlibrary            ; Macro opens library
  121.         Beq      Freemem                ; If it doesn't open, we quit
  122.         Move.l   D0,MKINTUITIONBASE(A4) ; Save the return address
  123.  
  124. Opendos:
  125.  
  126. ;     Ditto for the Dos library
  127.  
  128.         Lea      Dosname,A1         ; Load dos library into a1
  129.         Move.l   #$00,D0            ; Any version will do
  130.         EXEC     Openlibrary        ; Macro opens library
  131.         Beq      Nodos              ; If there's a problem, close down
  132.         Move.l   D0,MKDOSBASE(A4)   ; Save the return address
  133.  
  134. CheckParam:
  135.  
  136. ;     Now, did the user actually give us any parameters?
  137.  
  138.         Tst.L   D5                      ; anyone home?
  139.         Beq     Usage                   ; No, so display Usage message
  140.  
  141.         Lea     MKSOURCE(A4),A0         ; Load the source buffer
  142.     Lea    MKDESTINATION(A4),A1    ; Load the dest buffer
  143.  
  144. 1$
  145.         Move.b  (a5)+,D0                ; Transfer a byte
  146.         Cmp.b   #$20,D0                 ; Is it a space?
  147.         Beq     2$                      ; Yep, so go on
  148.         Cmp.b   #$0A,D0                 ; Is it a Linefeed?
  149.         Beq     Usage                   ; Yep, a bit early so outta here
  150.         Cmp.b   #$00,D0                 ; Is it nothing?
  151.         Beq     Usage                   ; Yep, got real probs now!
  152.         Move.b  d0,(a0)+                ; Else move it to source buffer
  153.         Bra     1$                      ; and back for next character
  154.  
  155. 2$
  156.         Move.b  (a5)+,D0                ; Transfer a byte
  157.         Cmp.b   #$00,d0                 ; Is it nothing?
  158.         Beq     Usage                   ; Oops, gone now.
  159.         Cmp.b   #$0A,D0                 ; Is it a linefeed?
  160.         Beq     Openfiles               ; Yep so finished parameters
  161.         Move.b  d0,(a1)+                ; Else move it to dest buffer
  162.         Bra     2$                      ; and back for another one
  163.  
  164. Openfiles:
  165.  
  166. ;     At this stage, theory is that all is well and we can press on
  167. ;     with  the file opening.  I do it slightly weirdingly (?), because
  168. ;     I like to check to see if the destination file exists, and then 
  169. ;     give the user and opportunity to bug out.
  170.  
  171.         Lea     MKSOURCE(A4),A0         ; Source file address to A0
  172.         Move.l  A0,D1                   ; and move it to D1
  173.         Move.l  #Mode_OLDFILE,D2        ; Opening as an existing file
  174.         CALLDOS Open                    ; Macro calls open function
  175.         Beq     Closedos                ; Oops, outta here!
  176.         Move.l  D0,MKINFILEHD(A4)       ; Save the infile handle
  177.  
  178.         Lea     MKDESTINATION(A4),A0    ; Dest file address to A0
  179.         Move.l  A0,D1                   ; and move it to D1
  180.         Move.l  #Mode_OLDFILE,D2        ; Opening as a old file first
  181.         CALLDOS Open                    ; Macro calls open function
  182.         Move.l  D0,MKOUTFILEHD(A4)      ; Save the file handle
  183.         Tst.b   D0                      ; Test if file already exists
  184.         Beq     1$                      ; If "NO" then move on ->
  185.         Move.l  #$00,A0                    ; else we start the AutoReq code
  186.         Lea     Atext,A1                ; The main body text to A1
  187.         Lea     Ltext,A2                ; ...and the left text to A2
  188.         Lea     Rtext,A3                ; ...and the right text to A3
  189.         Move.l  #$00,D0                 ; left button clicked
  190.         Move.l  #$00,D1                 ; right button clicked
  191.         Move.l  #$C4,D2                 ; requester length
  192.         Move.l  #$35,D3                 ; requester height
  193.         CALLINT Autorequest             ; call the requester
  194.         Tst.b   D0                      ; Test if right button selected
  195.         Beq     1$                      ; Yes...so move on
  196.  
  197. ;     Closing the files prior to bugout!
  198.  
  199.         Move.l  MKINFILEHD(A4),D1       ; Infilehandle
  200.         CALLDOS Close                   ; ...and closed
  201.         Move.l  MKOUTFILEHD(A4),D1      ; Outfile handle
  202.         CALLDOS Close                   ; ...and closed
  203.         Bra     Closedos                ; Outtahere
  204.  
  205. ;     Let's try all that again!
  206.  
  207. 1$      Move.l  MKOUTFILEHD(A4),D1      ; Load the outfile handle
  208.         CALLDOS Close                   ; Macro calls function
  209.         Lea     MKDESTINATION(A4),A0    ; Load address of dest file to A0
  210.         Move.l  A0,D1                   ; and move it to D1
  211.         Move.l  #Mode_NEWFILE,D2        ; Opening as a new file
  212.         CALLDOS Open                    ; Macro calls open function
  213.         Bne     2$                      ; All OK so move along
  214.         Move.l  MKINFILEHD(A4),D1       ; If error load infile handle...
  215.         CALLDOS Close                   ; ...and close the file...
  216.         Bra     Closedos                ; ...and gone
  217. 2$      Move.l  D0,MKOUTFILEHD(A4)      ; Else save the outfile handle
  218.  
  219. Copying:
  220.  
  221. ;     The files are open, the birds are singing and it's time for this
  222. ;     program to earn its keep.
  223.  
  224.         Lea     MKBUFFER(A4),A0         ; Address of buffer to A0
  225.         Move.l  A0,D2                   ; and move it to D1
  226.         Move.l  MKINFILEHD(A4),D1       ; Infile handle to D1
  227.         Move.l  #512,D3                 ; Size of buffer to D3
  228.         CALLDOS Read                    ; Read it!
  229.     Beq     Closefiles              ; Oops! I'm gone
  230.  
  231.         Lea     MKBUFFER(A4),A0         ; Address of buffer to A0
  232.         Move.l  A0,D2                   ; and move it to D2
  233.         Move.l  MKOUTFILEHD(A4),D1      ; Outfile handle to D1
  234.         Move.l  D0,D3                   ; Size of last read to D3
  235.         CALLDOS Write                   ; Macro Writes to file
  236.         Beq     Closefiles              ; No joy so gone...
  237.     Bra    Copying                 ; else back for another read
  238.  
  239. Closefiles:
  240.  
  241. ;     Phew!  After all that hard work I'll do the dishes and clean up the
  242. ;     kitchen.
  243.  
  244.         Move.l  MKINFILEHD(A4),D1       ; Load the infile handle
  245.         CALLDOS Close                   ; Macro calls function
  246.         Move.l  MKOUTFILEHD(A4),D1      ; Load the outfile handle
  247.         CALLDOS Close                   ; Macro calls function
  248.         Bra     Closedos                ; Then go
  249.  
  250. Usage:
  251.  
  252. ;     Here we tell the user how to use the program just in case they come
  253. ;     from the planet Urgania.
  254.  
  255.         Calldos Output                  ; Call the output function
  256.         Beq     Closedos                ; No can do, so outta here ->
  257.         Move.l  D0,D1                   ; else shift output handle to D1
  258.         Move.l  #Message,D2             ; Load message...
  259.         Move.l  #SZMess,D3              ; ...plus its length...
  260.         Calldos Write                   ; ..and write it  
  261.  
  262. Closedos:
  263.  
  264. ;     Closes the dos library!
  265.  
  266.         Move.l   MKDOSBASE(A4),A1       ; Move dos base into a1
  267.         EXEC     Closelibrary           ; Macro closes dos
  268.  
  269. Nodos:
  270.  
  271. ;     Closes the intuition library!
  272.  
  273.         Move.l   MKINTUITIONBASE(A4),A1 ; Move intuition base into a1
  274.         EXEC     Closelibrary           ; Macro closes intuition
  275.  
  276.  
  277. Freemem:
  278.  
  279. ;     Just some memory housekeeping.
  280.  
  281.     Move.l    a4,a1                   ; Move the buffer to A1
  282.     Move.l    #TOTALMEM,d0            ; and its size
  283.     EXEC    Freemem                 ; and be free!
  284.  
  285. Exit:
  286.  
  287. ;     Sadly now we sing again to each and every one.  Gladly we'll come
  288. ;     back and all have more fun.
  289.  
  290.         Clr.L    D0                     ; Clear D0
  291.         Rts                             ; Return To System
  292.  
  293. Atext:
  294.  
  295. ; Intuitext structure
  296.  
  297.         DC.B    $02,$01,$01        ; FrontPen,BackPen,DrawMode
  298.  
  299.         Even                       ; Fill to make even address for word
  300.  
  301.         DC.W    $0D,$08            ; Left edge, top edge
  302.         DC.L    $00                ; No special font
  303.         DC.L    Atx                ; The actual text
  304.         DC.L    $00                ; No next text
  305.  
  306. Ltext:
  307.  
  308. ; Intuitext structure
  309.  
  310.         DC.B    $02,$01,$01        ; FrontPen,BackPen,DrawMode
  311.  
  312.         Even                       ; Fill to make even address for word
  313.  
  314.         DC.W    $06,$03            ; Left edge, top edge
  315.         DC.L    $00                ; No special font
  316.         DC.L    Ltx                ; The actual text
  317.         DC.L    $00                ; No next text 
  318.  
  319. Rtext:
  320.  
  321. ; Intuitext structure
  322.  
  323.         DC.B    $02,$01,$01        ; FrontPen,BackPen,DrawMode
  324.  
  325.         Even                       ; Fill to make even address for word
  326.  
  327.         DC.W    $06,$03            ; Left edge, top edge
  328.         DC.L    $00                ; No special font
  329.         DC.L    Rtx                ; The actual text
  330.         DC.L    $00                ; No next text 
  331.  
  332. ; Some final definitions
  333.  
  334. Atx:            DC.B    "Copy over old file?",$00
  335. Ltx:            DC.B    "No",$00
  336. Rtx:            DC.B    "Yes",$00
  337.  
  338. Intname:    DC.B    "intuition.library",0
  339. Dosname:    DC.B    "dos.library",0
  340.  
  341. Message:
  342.  
  343.         Dc.B    LF,"    "                  ;
  344.         Dc.B    "Usage: APCopy"      ;
  345.         Dc.B    " <source> <destination> "          ; Text of message
  346.         Dc.B    "A N Peck - 1995" ;
  347.         Dc.B    LF,LF                      ;
  348.  
  349. SZMess  = *-Message                        ; Size of message
  350.  
  351.         END
  352.  
  353.  
  354.